package com.proyecto.seguridad.modelo.servicio;

import java.util.List;

import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.core.modelo.servicio.interfaces.IServicioTransaccion;
import com.proyecto.seguridad.modelo.dto.SegOperacionesUs;
import com.proyecto.seguridad.modelo.dto.SegUsuarios;
import com.twmacinta.util.MD5;

public class ServicioSegUsuarios extends ServicioGenerico {
	
	private IServicioTransaccion servicioSegOpeUs;

	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion)
			throws GeneralException {
		
		asignarClaveEncriptada((SegUsuarios)pojo);
		super.incluir(pojo, iniciaTransaccion);
	}

	@Override
	public void modificar(Object pojo, boolean iniciaTransaccion)
			throws GeneralException {
		asignarClaveEncriptada((SegUsuarios)pojo);
		super.modificar(pojo, iniciaTransaccion);
	}
	
	public String copiarPermisosUsuario(String ciaopr,String usuarioCodCopiar,String usuarioCodNuevo){
		String query = "select new List(sou.id.ciaopr, sou.id.usuariocodigo, sou.id.operacioncod,sou.acceder," +
				" sou.incluir, sou.modificar, sou.eliminar, sou.consultar) " +
				"from SegOperacionesUs sou where sou.id.ciaopr = '"+ciaopr+"' " +
				"and sou.id.usuariocodigo = '"+usuarioCodCopiar+"'";
		List operaciones = propiedadDAO.ejecutarQueryConsulta(query);
		String operacionesProblemas = "";
		SegOperacionesUs segOpeUsu = new SegOperacionesUs();
		
		if(operaciones.size()>0){
			for(int i=0; i<operaciones.size();i++){
				segOpeUsu.getId().setCiaopr(((List)operaciones.get(i)).get(0).toString().trim());//ciaopr
				segOpeUsu.getId().setUsuariocodigo(usuarioCodNuevo);//usuariocodigo
				segOpeUsu.getId().setOperacioncod(((List)operaciones.get(i)).get(2).toString().trim());//operaconcod
				
				segOpeUsu.setAcceder(((List)operaciones.get(i)).get(3).toString().trim());//Acceder
				segOpeUsu.setIncluir(((List)operaciones.get(i)).get(4).toString().trim());//Incluir
				segOpeUsu.setModificar(((List)operaciones.get(i)).get(5).toString().trim());//Modificar
				segOpeUsu.setEliminar(((List)operaciones.get(i)).get(6).toString().trim());//Eliminar
				segOpeUsu.setConsultar(((List)operaciones.get(i)).get(7).toString().trim());//Consultar
				
				try {
					servicioSegOpeUs.incluir(segOpeUsu, true);
				} catch (GeneralException e) {
					if(e.getClaveMensaje().equals("advertencia.persona.seguridad.usuarios.incluir.registroDuplicado")){
						try {
							segOpeUsu = (SegOperacionesUs) servicioSegOpeUs.consultar(segOpeUsu.getId());
							servicioSegOpeUs.modificar(segOpeUsu, true);
						} catch (GeneralException e1) {
							operacionesProblemas = ((List)operaciones.get(i)).get(2).toString().trim() + "/n";
						}
					}else{
						operacionesProblemas = ((List)operaciones.get(i)).get(2).toString().trim() + "/n";
					}
				}
			}
		}
		return operacionesProblemas;
	}

	public String encriptarClave(String clave){
		MD5 md = new MD5(clave);
		return md.asHex();
	}
	
	private void asignarClaveEncriptada(SegUsuarios pojo){
		if(pojo.getUsuarioclave() == null){
			
		}else{
			if (!pojo.getUsuarioclave().equals(pojo.getUsuarioclavecomparacion())){
				String claveEncriptada = this.encriptarClave(pojo.getUsuarioclave());
				pojo.setUsuarioclave(claveEncriptada);
				pojo.setUsuarioclavecomparacion(claveEncriptada);
			}			
		}
		
	}
	
	public IServicioTransaccion getServicioSegOpeUs() {
		return servicioSegOpeUs;
	}

	public void setServicioSegOpeUs(IServicioTransaccion servicioSegOpeUs) {
		this.servicioSegOpeUs = servicioSegOpeUs;
	}
	
}
